Nesse projeto foi desenvolvida uma análise exploratória dos dados de condições de saneamento nos estados do Brasil. O principal objetivo era a criação de um gráfico de pontos, mostrando a relação entre a proporção da população atendida com abastecimento e a proporção da população atendida com esgotamento, considerando todos os estados (diferentes cores) e o tamanho da população (tamanho dos pontos). Porém, mais algumas análises, principalmente gráficas, foram executadas.

Finalmente, você pode acompanhar todo o desenvolvimento desse projeto, pois explico passo a passo todos os procedimentos que foram utilizados. Primeiramente, vamos carregar os pacotes necessários, os dados e vamos visualizar os dados em formato de tabela. Os dados foram extraídos da Confederação Nacional de Municípios (CNM). url: https://www.cnm.org.br/municipios/registros/100151/todos

# Carregando os pacotes
library(data.table)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:data.table':
## 
##     between, first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(ggpubr)
library(corrplot)
## corrplot 0.90 loaded
# Carregando os dados
df <- fread('data/planilha_resumo.csv', skip = 8)

# Visualizando os dados
View(df)

Como visualizado na figura, o cabeçalho da tabela de dados está bem desorganizada, e portanto, vamos fazer um trabalho de limpeza e organização dos dados.

# Fazendo o update do dataframe com as linhas 4, 1 e todas as outras partir da 5
df <- rbind(rbind(df[4,],df[1,]), df[5:length(df$V1),])

# Nomeando a variável que contem os estados, pois a linha 1 será utilizada como nome das variáveis (colunas)
df[1,1] <- "State"

# Renomeando as colunas, utilizando a linha 1 como character
colnames(df) <- sapply(df[1,], as.character)

# Removendo a primeira linha dos dados, pois já não precisamos mais dela
df <- df[-1,]

# Visualizando as mudanças
View(df)

A tabela já parece bem mais limpa e organizada, mas ainda temos um pouco de trabalho para a preparação dos dados. Primeiro, vamos selecionar as variáveis de interesse, para então darmos prosseguimento com a limpeza.

# Selecionando as variáveis de interesse para esta análise exploratória
df <- df %>%
  select(State, GE05a, GE05b, FN002, FN003, AG001, AG007, AG010, ES001, ES005, ES006)

Nomeando as colunas que não tinham nome e renomeando algumas colunas para facilitar a interpretação das variáveis. Esses dados também serão usados para a criação de um dicionário de dados para consulta.

# Renomeando a primeira linha dos dados para facilitar o entendimento das variáveis bem como para a criação de um dicionário de dados para consulta
df[1,4] <- "Receitas operacionais diretas com agua"
df[1,5] <- "Receitas operacionais diretas com esgoto"
df[1,7] <- "Volume de agua tratada em ETAs"
df[1,8] <- "Volume de agua consumido"
df[1,10] <- "Volume de esgoto coletado"
df[1,11] <- "Volume de esgoto tratado"

Agora vamos criar um novo dataframe com o dicionario dos dados, contendo o nome das variáveis e sua correspondente descrição. Depois, removemos a primeira linha da tabela de dados e a coluna Symbol, visto que a tabela possui como index esses mesmos valores. Finalmente visualizamos o dicionário de dados.

# Criando um dataframe com duas colunas (symbol e description)
df_dict <- data.frame(symbol = colnames(df),
                      description = t(df[1,])[,1])

# Removendo a primeira linha dos dados, pois não contém informação
df_dict <- df_dict[-1,]

# Removendo a coluna Symbol, pois já temos os símbolos das variáveis como index
df_dict$symbol <- NULL

# Visualizando o dicionário de dados
df_dict
##                                              description
## GE05a Quantidade de municípios atendidos com abastecimen
## GE05b Quantidade de municípios atendidos com esgotamento
## FN002             Receitas operacionais diretas com agua
## FN003           Receitas operacionais diretas com esgoto
## AG001 População total atendida com abastecimento de água
## AG007                     Volume de agua tratada em ETAs
## AG010                           Volume de agua consumido
## ES001 População total atendida com esgotamento sanitário
## ES005                          Volume de esgoto coletado
## ES006                           Volume de esgoto tratado
# Agora podemos remover a primeira linha do conjunto de dados df, pois já temos o dicionário de dados para consulta
df <- df[-1,]

Vamos visualizar os tipos de dados das variáveis selecionadas.

# Visualizando os tipos de dados
glimpse(df)
## Rows: 38
## Columns: 11
## $ State <chr> "N - Norte", "Acre (AC)", "Amapá (AP)", "Amazonas (AM)", "Pará (…
## $ GE05a <chr> "", "22", "16", "25", "86", "48", "15", "143", "355", "", "89", …
## $ GE05b <chr> "", "1", "6", "3", "17", "10", "3", "18", "58", "", "22", "168",…
## $ FN002 <chr> "", "64.063.550,82", "56.785.323,26", "472.271.251,57", "377.845…
## $ FN003 <chr> "", "8.965.444,00", "12.178.855,22", "55.426.612,20", "36.918.40…
## $ AG001 <chr> "", "423.469", "290.944", "2.584.829", "2.967.413", "818.865", "…
## $ AG007 <chr> "", "54.977,40", "60.810,07", "196.716,84", "138.507,44", "74.02…
## $ AG010 <chr> "", "22.986,44", "17.394,68", "86.277,83", "159.523,15", "43.427…
## $ ES001 <chr> "", "88.199", "59.574", "441.358", "405.270", "103.461", "365.28…
## $ ES005 <chr> "", "4.472,62", "3.024,74", "19.754,57", "25.389,39", "3.989,32"…
## $ ES006 <chr> "", "4.472,62", "2.871,23", "19.544,57", "11.041,80", "3.073,45"…

Como pode ser observado, os dados estã como character, porém são numéricos. Primeiro, vamos utilizar a função gsub() para trocar o é vírgula por ponto como separador decimal e remover os pontos como separador de milhares. Na sequência, faremos a transformação para numérico.

# Substituindo vírgula por ponto com decimal e removendo pontos como separador de milhares para todas as variáveis que serão transformadas em numéricas (exceto State)
df$GE05a <- sapply(df$GE05a, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$GE05b <- sapply(df$GE05b, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$FN002 <- sapply(df$FN002, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$FN003 <- sapply(df$FN003, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$AG001 <- sapply(df$AG001, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$AG007 <- sapply(df$AG007, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$AG010 <- sapply(df$AG010, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$ES001 <- sapply(df$ES001, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$ES005 <- sapply(df$ES005, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )
df$ES006 <- sapply(df$ES006, function(x) { ifelse(is.na(x), NA ,gsub(",", ".", gsub("\\.", "", x))) } )

# Tranformando as variáveis numéricas para dados do tipo numérico
df$GE05a <- sapply(df$GE05a, function(x) { as.numeric(x) } )
df$GE05b <- sapply(df$GE05b, function(x) { as.numeric(x) } )
df$FN002 <- sapply(df$FN002, function(x) { as.numeric(x) } )
df$FN003 <- sapply(df$FN003, function(x) { as.numeric(x) } )
df$AG001 <- sapply(df$AG001, function(x) { as.numeric(x) } )
df$AG007 <- sapply(df$AG007, function(x) { as.numeric(x) } )
df$AG010 <- sapply(df$AG010, function(x) { as.numeric(x) } )
df$ES001 <- sapply(df$ES001, function(x) { as.numeric(x) } )
df$ES005 <- sapply(df$ES005, function(x) { as.numeric(x) } )
df$ES006 <- sapply(df$ES006, function(x) { as.numeric(x) } )

Agora vamos criar uma nova tabela de dados com os dados regionais para que possamos remover essas linhas da tabela de dados df. Para isso, primeiro, criamos uma nova variável de regiões, chamado Region, e inserimos no dataframe df. Depois, criamos a tabela de dados df_per_Region com os dados de cada região. Finalmente, renomeamos a das regiões como Region bem como criamos a variável Region nessa tabela de dados. Finalmente, visualizamos as transformações.

# Criando a variável Region na tabela de dados df
df$Region <- c(rep('Norte',9), rep('Nordeste',11), rep('Sudeste',6), rep('Sul',5), rep('Centro_Oeste',6), 'Brazil')

# Criando uma nova tabela de dados com os dados das regiões
df_per_Region <- df[c(9,20,26,31,37),]

# Renomeando a primeira coluna (regiões)
colnames(df_per_Region)[1] <- 'Region'

# Criando uma nova variável Region na tabela de dados df_per_Region
df_per_Region$Region <- c('Norte', 'Nordeste', 'Sudeste', 'Sul', 'Centro_Oeste')

# Visualizando a tabela de dados df_per_Region
df_per_Region
##          Region GE05a GE05b       FN002       FN003    AG001     AG007
## 1:        Norte   355    58  1590834832   266626564  8987680  617853.8
## 2:     Nordeste  1636   531  8418730605  2661381719 40523130 2526440.5
## 3:      Sudeste  1605  1408 21202953280 15516173738 80019344 7338231.1
## 4:          Sul  1159   415  8894765290  2835125424 26931471 2036564.9
## 5: Centro_Oeste   422   180  4092583204  2195027451 14342891  885503.8
##        AG010    ES001      ES005      ES006       Region
## 1:  423084.8  1927986   91613.93   75725.76        Norte
## 2: 1795163.1 15498076  702778.46  583822.67     Nordeste
## 3: 5286628.2 69879184 3921041.03 2811474.57      Sudeste
## 4: 1472843.1 13768012  675170.47  638806.03          Sul
## 5:  783633.3  9227084  436081.58  406284.52 Centro_Oeste
# Visualizando a tabela de dados df
df
##                        State GE05a GE05b       FN002       FN003     AG001
##  1:                N - Norte    NA    NA          NA          NA        NA
##  2:                Acre (AC)    22     1    64063551     8965444    423469
##  3:               Amapá (AP)    16     6    56785323    12178855    290944
##  4:            Amazonas (AM)    25     3   472271252    55426612   2584829
##  5:                Pará (PA)    86    17   377845478    36918410   2967413
##  6:            Rondônia (RO)    48    10   170501397     8482893    818865
##  7:             Roraima (RR)    15     3    66628268    30019054    494697
##  8:           Tocantins (TO)   143    18   382739565   114635296   1407463
##  9:         Total por grupo:   355    58  1590834832   266626564   8987680
## 10:            NE - Nordeste    NA    NA          NA          NA        NA
## 11:             Alagoas (AL)    89    22   481866324   105737460   2357068
## 12:               Bahia (BA)   396   168  2642815114   948707100  11725988
## 13:               Ceará (CE)   177    98  1171507477   473834115   5238334
## 14:            Maranhão (MA)   167    18   541813830   190318367   3427119
## 15:             Paraíba (PB)   210    54   642062222   246324125   2910101
## 16:          Pernambuco (PE)   178    69  1341542878   390573480   7642886
## 17:               Piauí (PI)   181    27   455499311    63483723   2357765
## 18: Rio Grande do Norte (RN)   163    63   620417502   132243256   2887371
## 19:             Sergipe (SE)    75    12   521205947   110160093   1976498
## 20:         Total por grupo:  1636   531  8418730605  2661381719  40523130
## 21:             SE - Sudeste    NA    NA          NA          NA        NA
## 22:      Espírito Santo (ES)    77    67   839716890   368186803   3243410
## 23:        Minas Gerais (MG)   812   651  4283310535  2486150246  17165390
## 24:      Rio de Janeiro (RJ)    88    62  5252276374  2993824343  15603715
## 25:           São Paulo (SP)   628   628 10827649481  9668012347  44006829
## 26:         Total por grupo:  1605  1408 21202953280 15516173738  80019344
## 27:                  S - Sul    NA    NA          NA          NA        NA
## 28:              Paraná (PR)   396   225  3217344170  1862826385  10749898
## 29:   Rio Grande do Sul (RS)   473   116  3681143736   515199578   9799440
## 30:      Santa Catarina (SC)   291    74  1996277384   457099462   6382133
## 31:         Total por grupo:  1159   415  8894765290  2835125424  26931471
## 32:        CO - Centro-Oeste    NA    NA          NA          NA        NA
## 33:    Distrito Federal (DF)     1     1   938573359   800649729   2985115
## 34:               Goiás (GO)   242    87  1724865200   947746314   6195837
## 35:  Mato Grosso do Sul (MS)    77    59   847221870   289899821   2374606
## 36:         Mato Grosso (MT)   102    33   581922775   156731587   2787333
## 37:         Total por grupo:   422   180  4092583204  2195027451  14342891
## 38:     TOTALIZAÇÃO NACIONAL  5177  2592 44199867212 23474334897 170804516
##                        State GE05a GE05b       FN002       FN003     AG001
##           AG007      AG010     ES001      ES005      ES006       Region
##  1:          NA         NA        NA         NA         NA        Norte
##  2:    54977.40   22986.44     88199    4472.62    4472.62        Norte
##  3:    60810.07   17394.68     59574    3024.74    2871.23        Norte
##  4:   196716.84   86277.83    441358   19754.57   19544.57        Norte
##  5:   138507.44  159523.15    405270   25389.39   11041.80        Norte
##  6:    74025.25   43427.38    103461    3989.32    3073.45        Norte
##  7:    35921.51   22912.62    365286   17147.36   17117.36        Norte
##  8:    56895.33   70562.71    464838   17835.93   17604.73        Norte
##  9:   617853.84  423084.81   1927986   91613.93   75725.76        Norte
## 10:          NA         NA        NA         NA         NA     Nordeste
## 11:   124997.17  134980.95    679181   21921.20   19945.44     Nordeste
## 12:   729151.15  494395.79   5790656  269352.47  227716.03     Nordeste
## 13:   385118.73  263770.06   2290370   99789.28   90935.75     Nordeste
## 14:   174883.28  182036.19    813839   49070.93   21450.99     Nordeste
## 15:   204207.72  123869.09   1364157   61172.29   54690.97     Nordeste
## 16:   534867.98  280533.39   2669648  118196.52   89420.35     Nordeste
## 17:   135851.90  107459.10    512687   18060.38   16016.28     Nordeste
## 18:    80325.78  112214.79    895519   38602.64   37433.71     Nordeste
## 19:   157036.74   95903.71    482019   26612.75   26213.15     Nordeste
## 20:  2526440.45 1795163.07  15498076  702778.46  583822.67     Nordeste
## 21:          NA         NA        NA         NA         NA      Sudeste
## 22:   326814.73  203625.62   2229294  121479.10   87216.01      Sudeste
## 23:  1402843.22  995033.43  15280408  800064.27  435892.21      Sudeste
## 24:  1909548.97 1253953.09  11072314  801816.63  498972.97      Sudeste
## 25:  3699024.17 2834016.02  41297168 2197681.03 1789393.38      Sudeste
## 26:  7338231.09 5286628.16  69879184 3921041.03 2811474.57      Sudeste
## 27:          NA         NA        NA         NA         NA          Sul
## 28:   639479.31  550832.22   8324363  405988.29  405477.52          Sul
## 29:   863143.49  529154.50   3648316  168772.41  138696.54          Sul
## 30:   533942.11  392856.33   1795333  100409.77   94631.97          Sul
## 31:  2036564.91 1472843.05  13768012  675170.47  638806.03          Sul
## 32:          NA         NA        NA         NA         NA Centro_Oeste
## 33:   227996.00  158200.00   2698062  129923.00  129923.00 Centro_Oeste
## 34:   355307.76  316820.74   3975006  180014.40  159802.28 Centro_Oeste
## 35:    93355.86  136660.51   1437203   60951.14   60854.86 Centro_Oeste
## 36:   208844.15  171952.07   1116813   65193.04   55704.38 Centro_Oeste
## 37:   885503.77  783633.32   9227084  436081.58  406284.52 Centro_Oeste
## 38: 13404594.06 9761352.41 110300342 5826685.47 4516113.55       Brazil
##           AG007      AG010     ES001      ES005      ES006       Region

Agora podemos remover as linhas que não contém informação por estado na tabela de dados df. Depois disso, criamos duas novas variáveis, chamadas Num_Mun e Population, contendo dados extraídos do IBGE e adicionados manualmente devido à problemas de conexão com o banco de dados que se encontrava fora do ar. Esses dados se referem ao número de municípios e a população para cada estado.

# Removendo as linhas que não contém informação estadual
df <- df[-c(1,9,10,20,21,26,27,31,32,37,38),]

# Criando duas novas colunas contendo o número de municípios e a população
df <- df %>%
  mutate(
    Num_Mun = c(22,16,62,144,52,15,139,102,417,184,217,223,185,224,
               167,75,78,853,92,645,399,497,295,1,246,79,141),
    Population = c(894470,861773,4207714,8690745,1796460,631181,1590248,
               3351543,14930634,9187103,7114598,4039277,9616621,3281480,
               3534165,2318822,4064052,21292666,17366189,46289333,11516840,
               11422973,7252502,3055149,7113540,2809394,3526220)
  )

Devido a uma falha no conjunto de dados, um dos dados (linha 7) foi ajustado, pois o número de municípios com atendimento de abastecimento era maior que o número de municípios presentes no estado. Desta forma, neste caso, simplesmente utilizamos o dado com o menor valor para o número de municípios (dado ofcial do IBGE). Finalmente, visualizamos as transformações nos dados.

# Ajustando o dado que estava estranho (row 7)
for (i in 1:length(df$GE05a)) {
  if (df$GE05a[i] > df$Num_Mun[i]) {
    df$GE05a[i] <- df$Num_Mun[i]
  }
}

# Visualizando as transformações na tabela df
df
##                        State GE05a GE05b       FN002      FN003    AG001
##  1:                Acre (AC)    22     1    64063551    8965444   423469
##  2:               Amapá (AP)    16     6    56785323   12178855   290944
##  3:            Amazonas (AM)    25     3   472271252   55426612  2584829
##  4:                Pará (PA)    86    17   377845478   36918410  2967413
##  5:            Rondônia (RO)    48    10   170501397    8482893   818865
##  6:             Roraima (RR)    15     3    66628268   30019054   494697
##  7:           Tocantins (TO)   139    18   382739565  114635296  1407463
##  8:             Alagoas (AL)    89    22   481866324  105737460  2357068
##  9:               Bahia (BA)   396   168  2642815114  948707100 11725988
## 10:               Ceará (CE)   177    98  1171507477  473834115  5238334
## 11:            Maranhão (MA)   167    18   541813830  190318367  3427119
## 12:             Paraíba (PB)   210    54   642062222  246324125  2910101
## 13:          Pernambuco (PE)   178    69  1341542878  390573480  7642886
## 14:               Piauí (PI)   181    27   455499311   63483723  2357765
## 15: Rio Grande do Norte (RN)   163    63   620417502  132243256  2887371
## 16:             Sergipe (SE)    75    12   521205947  110160093  1976498
## 17:      Espírito Santo (ES)    77    67   839716890  368186803  3243410
## 18:        Minas Gerais (MG)   812   651  4283310535 2486150246 17165390
## 19:      Rio de Janeiro (RJ)    88    62  5252276374 2993824343 15603715
## 20:           São Paulo (SP)   628   628 10827649481 9668012347 44006829
## 21:              Paraná (PR)   396   225  3217344170 1862826385 10749898
## 22:   Rio Grande do Sul (RS)   473   116  3681143736  515199578  9799440
## 23:      Santa Catarina (SC)   291    74  1996277384  457099462  6382133
## 24:    Distrito Federal (DF)     1     1   938573359  800649729  2985115
## 25:               Goiás (GO)   242    87  1724865200  947746314  6195837
## 26:  Mato Grosso do Sul (MS)    77    59   847221870  289899821  2374606
## 27:         Mato Grosso (MT)   102    33   581922775  156731587  2787333
##                        State GE05a GE05b       FN002      FN003    AG001
##          AG007      AG010    ES001      ES005      ES006       Region Num_Mun
##  1:   54977.40   22986.44    88199    4472.62    4472.62        Norte      22
##  2:   60810.07   17394.68    59574    3024.74    2871.23        Norte      16
##  3:  196716.84   86277.83   441358   19754.57   19544.57        Norte      62
##  4:  138507.44  159523.15   405270   25389.39   11041.80        Norte     144
##  5:   74025.25   43427.38   103461    3989.32    3073.45        Norte      52
##  6:   35921.51   22912.62   365286   17147.36   17117.36        Norte      15
##  7:   56895.33   70562.71   464838   17835.93   17604.73        Norte     139
##  8:  124997.17  134980.95   679181   21921.20   19945.44     Nordeste     102
##  9:  729151.15  494395.79  5790656  269352.47  227716.03     Nordeste     417
## 10:  385118.73  263770.06  2290370   99789.28   90935.75     Nordeste     184
## 11:  174883.28  182036.19   813839   49070.93   21450.99     Nordeste     217
## 12:  204207.72  123869.09  1364157   61172.29   54690.97     Nordeste     223
## 13:  534867.98  280533.39  2669648  118196.52   89420.35     Nordeste     185
## 14:  135851.90  107459.10   512687   18060.38   16016.28     Nordeste     224
## 15:   80325.78  112214.79   895519   38602.64   37433.71     Nordeste     167
## 16:  157036.74   95903.71   482019   26612.75   26213.15     Nordeste      75
## 17:  326814.73  203625.62  2229294  121479.10   87216.01      Sudeste      78
## 18: 1402843.22  995033.43 15280408  800064.27  435892.21      Sudeste     853
## 19: 1909548.97 1253953.09 11072314  801816.63  498972.97      Sudeste      92
## 20: 3699024.17 2834016.02 41297168 2197681.03 1789393.38      Sudeste     645
## 21:  639479.31  550832.22  8324363  405988.29  405477.52          Sul     399
## 22:  863143.49  529154.50  3648316  168772.41  138696.54          Sul     497
## 23:  533942.11  392856.33  1795333  100409.77   94631.97          Sul     295
## 24:  227996.00  158200.00  2698062  129923.00  129923.00 Centro_Oeste       1
## 25:  355307.76  316820.74  3975006  180014.40  159802.28 Centro_Oeste     246
## 26:   93355.86  136660.51  1437203   60951.14   60854.86 Centro_Oeste      79
## 27:  208844.15  171952.07  1116813   65193.04   55704.38 Centro_Oeste     141
##          AG007      AG010    ES001      ES005      ES006       Region Num_Mun
##     Population
##  1:     894470
##  2:     861773
##  3:    4207714
##  4:    8690745
##  5:    1796460
##  6:     631181
##  7:    1590248
##  8:    3351543
##  9:   14930634
## 10:    9187103
## 11:    7114598
## 12:    4039277
## 13:    9616621
## 14:    3281480
## 15:    3534165
## 16:    2318822
## 17:    4064052
## 18:   21292666
## 19:   17366189
## 20:   46289333
## 21:   11516840
## 22:   11422973
## 23:    7252502
## 24:    3055149
## 25:    7113540
## 26:    2809394
## 27:    3526220
##     Population

Agora que os dados estão bem organizados, podemos começar nossa análise gráfica para ver se conseguímos alguns insights e depois vamos produzir o gráfico de pontos descrito no objetivo deste projeto. Primeiramente, vamos calcular algumas estatísticas.

# Apresentando estatística descritiva dos dados
summary(df)
##     State               GE05a           GE05b           FN002          
##  Length:27          Min.   :  1.0   Min.   :  1.0   Min.   :5.679e+07  
##  Class :character   1st Qu.: 76.0   1st Qu.: 14.5   1st Qu.:4.639e+08  
##  Mode  :character   Median :139.0   Median : 54.0   Median :6.421e+08  
##                     Mean   :191.6   Mean   : 96.0   Mean   :1.637e+09  
##                     3rd Qu.:226.0   3rd Qu.: 80.5   3rd Qu.:1.861e+09  
##                     Max.   :812.0   Max.   :651.0   Max.   :1.083e+10  
##      FN003               AG001              AG007             AG010        
##  Min.   :8.483e+06   Min.   :  290944   Min.   :  35922   Min.   :  17395  
##  1st Qu.:8.461e+07   1st Qu.: 2357416   1st Qu.: 109177   1st Qu.: 101681  
##  Median :2.463e+08   Median : 2967413   Median : 204208   Median : 159523  
##  Mean   :8.694e+08   Mean   : 6326093   Mean   : 496466   Mean   : 361532  
##  3rd Qu.:6.579e+08   3rd Qu.: 7012510   3rd Qu.: 534405   3rd Qu.: 354838  
##  Max.   :9.668e+09   Max.   :44006829   Max.   :3699024   Max.   :2834016  
##      ES001              ES005             ES006            Region         
##  Min.   :   59574   Min.   :   3025   Min.   :   2871   Length:27         
##  1st Qu.:  473428   1st Qu.:  20838   1st Qu.:  18575   Class :character  
##  Median : 1364157   Median :  61172   Median :  55704   Mode  :character  
##  Mean   : 4085198   Mean   : 215803   Mean   : 167264                     
##  3rd Qu.: 3173189   3rd Qu.: 149348   3rd Qu.: 134310                     
##  Max.   :41297168   Max.   :2197681   Max.   :1789393                     
##     Num_Mun        Population      
##  Min.   :  1.0   Min.   :  631181  
##  1st Qu.: 76.5   1st Qu.: 2932272  
##  Median :144.0   Median : 4064052  
##  Mean   :206.3   Mean   : 7842803  
##  3rd Qu.:235.0   3rd Qu.: 9401862  
##  Max.   :853.0   Max.   :46289333

Vamos verificar se há correlações entre as variáveis numéricas.

# Calculando a correlação para as variáveis numéricas
df_cor <- cor(df[,-c('State','Region')], method = "spearman")

# Resultados da análise de correlação
df_cor
##                GE05a     GE05b     FN002     FN003     AG001     AG007
## GE05a      1.0000000 0.8883458 0.7157252 0.6711451 0.7487023 0.6885497
## GE05b      0.8883458 1.0000000 0.8468469 0.8013438 0.8251642 0.7790503
## FN002      0.7157252 0.8468469 1.0000000 0.9700855 0.9340659 0.9279609
## FN003      0.6711451 0.8013438 0.9700855 1.0000000 0.9157509 0.8968254
## AG001      0.7487023 0.8251642 0.9340659 0.9157509 1.0000000 0.9499389
## AG007      0.6885497 0.7790503 0.9279609 0.8968254 0.9499389 1.0000000
## AG010      0.7441222 0.8474577 0.9371184 0.9151404 0.9700855 0.9395604
## ES001      0.6946565 0.8318828 0.9774115 0.9859585 0.9230769 0.9090354
## ES005      0.6512977 0.7943198 0.9664225 0.9737485 0.9420024 0.9340659
## ES006      0.6442748 0.7989007 0.9810745 0.9841270 0.9053724 0.9059829
## Num_Mun    0.9899237 0.8621164 0.6880342 0.6422466 0.7527473 0.6776557
## Population 0.7554199 0.8025654 0.8406593 0.7942613 0.9566545 0.9120879
##                AG010     ES001     ES005     ES006   Num_Mun Population
## GE05a      0.7441222 0.6946565 0.6512977 0.6442748 0.9899237  0.7554199
## GE05b      0.8474577 0.8318828 0.7943198 0.7989007 0.8621164  0.8025654
## FN002      0.9371184 0.9774115 0.9664225 0.9810745 0.6880342  0.8406593
## FN003      0.9151404 0.9859585 0.9737485 0.9841270 0.6422466  0.7942613
## AG001      0.9700855 0.9230769 0.9420024 0.9053724 0.7527473  0.9566545
## AG007      0.9395604 0.9090354 0.9340659 0.9059829 0.6776557  0.9120879
## AG010      1.0000000 0.9261294 0.9462759 0.9120879 0.7442002  0.9242979
## ES001      0.9261294 1.0000000 0.9810745 0.9829060 0.6654457  0.8125763
## ES005      0.9462759 0.9810745 1.0000000 0.9798535 0.6361416  0.8388278
## ES006      0.9120879 0.9829060 0.9798535 1.0000000 0.6129426  0.7887668
## Num_Mun    0.7442002 0.6654457 0.6361416 0.6129426 1.0000000  0.7728938
## Population 0.9242979 0.8125763 0.8388278 0.7887668 0.7728938  1.0000000
# Resultados da análise de correlação de forma gráfica
corrplot(df_cor)

Como visto anteriormente, existe uma forte correlação entre algumas variáveis numéricas e moderada para outras. Vale a pena pegar o dicionário de dados e verificar essas correlações com calma. Esse primeiro gráfico mostra a porcentagem de municípios atendidos com abastecimento de água por Estado. Esse gráfico mostra que o Amazonas ainda deixa muito a desejar com relação ao fornecimento de água para os municípios, apresentando uma proporção bem baixa dos municípios com atendimento de abastecimento.Alguns outros estados como Pará, Mato Gross, Maranhão e Piauí também merecem destaque e precisam de aumentar o número de municípios com atendimento de abastecimento se quiserem se igualar à média, que se encontra acima dos 90%.

ggplot(df) +
  geom_bar(aes(x=State, y=(GE05a / Num_Mun)*100),
           stat = 'identity') +
  theme_bw() +
  ylab('Municípios atendidos (%)') +
  xlab('Estado') +
  ggtitle('Proporção de municipios atendido com abastecimento por Estado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

O segundo gráfico ilustra a porcentagem de municípios que são atendidos com esgotamento por estado. Ao contrário do que observamos para o abastecimento, onde somente alguns estados estão bem abaixo da média, nesse caso, apenas alguns estados apresentam uma alta proporção de municípios atendidos com esgotamento, tais como DF e SP. Outros estados que também apresentam proporções bem acima da média são ES, MG, MS, RJ, PR e CE. Todos os outros estados não possuem nem 50% dos seus municípios com atendimento de esgotamento. Triste realidade! :/

ggplot(df) +
  geom_bar(aes(x=State, y=(GE05b / Num_Mun)*100),
           stat = 'identity') +
  theme_bw() +
  ylab('Municípios atendidos (%)') +
  xlab('Estado') +
  ggtitle('Proporção de municipios atendido com esgotamento por Estado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

O próximo gráfico ilustra a proporção da população atendida com abastecimento de água por Estado.

ggplot(df) +
  geom_bar(aes(x=State, y=AG001 / Population * 100),
           stat = 'identity') +
  theme_bw() +
  ylab('População atendida (%)') +
  xlab('Estado') +
  ggtitle('Proporção da população atendida com abastecimento por Estado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

O próximo gráfico apresenta a proporção da população atendida com esgotamento por Estado.

ggplot(df) +
  geom_bar(aes(x=State, y=ES001 / Population * 100),
           stat = 'identity') +
  theme_bw() +
  ylab('População atendida (%)') +
  xlab('Estado') +
  ggtitle('Proporção da população atendida com esgotamento por Estado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

No próximo gráfico foi plotado as receitas operacionais diretas com abastecimendo de água per capta por Estado. A maior receita operacional per capta encontra-se no RS (> 320 reais / por pessoa) enquanto que a menor receita operacional foi observada no estado do Pará (< 45 reais). Esses valores estão bem distante da média de aproximadamente 183 reais, o que causa essa disparidade nos gastos, e consequentemente, mostra o porque temos grandes diferenças na proporção de abastecimento nos estados Brasileiros.

ggplot(df) +
  geom_bar(aes(x=State, y=FN002 / Population),
           stat = 'identity') +
  theme_bw() +
  ylab('Receitas operacionais (R$)') +
  xlab('Estado') +
  ggtitle('Receitas operacionais direta com água per capta por Estado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

Para o atendimento com esgotamento, pode ser observado que os estados com maior receita operacional percapta são DF, SP, RJ and PR (> 150 reais), following this order. Por outro lado, RO e PA possuem gastos operacionais abaixo de 5 reais para o esgotamento. Como pode ser observado na figura abaixo, a discrepância de receitas operacionais para o esgotamento entre os estados é ainda maior que a observada para o abastecimento.

ggplot(df) +
  geom_bar(aes(x=State, y=FN003 / Population),
           stat = 'identity') +
  theme_bw() +
  ylab('Receitas operacionais (R$)') +
  xlab('Estado') +
  ggtitle('Receitas operacionais direta com esgoto per capta por Estado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

Agora vamos plotar dois gráficos de pontos mostrando a relação entre a proporção da população atendida e as receitas operacionais per capta, tanto para o abastecimento de água (blue), quanto para esgotamento (brown). Podemos observar que há uma relação entre as receitas e a proporção de atendimento, o que era esperado. Mas é interessante observar que alguns estados conseguem atender uma proporção maior da população utilizando receitas operacionais menores.

ggplot(df) +
  geom_point(aes(x=FN002 / Population, y=AG001 / Population * 100),
           color='blue', alpha=0.5) +
  theme_bw() +
  ylab('População atendida com abastecimento (%)') +
  xlab('Receitas operacionais per capta com abastecimento (R$)') +
  ggtitle('População atendida X Receitas operacionais per capta - abastecimento') +
  ylim(0,100) +
  xlim(0,NA) +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

ggplot(df) +
  geom_point(aes(x=FN003 / Population, y=ES001 / Population * 100),
           color='brown', alpha=0.5) +
  theme_bw() +
  ylab('População atendida com esgotamento (%)') +
  xlab('Receitas operacionais per capta com esgotamento (R$)') +
  ggtitle('População atendida X operacionais per capta - esgotamento') +
  ylim(0,100) +
  xlim(0,NA) +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Agora vamos apresentar um gráfico mostrando o volume (L) de água tratada (azul claro) e consumida (azul), bem como o volume (L) de esgoto coletado (marrom) e tratado (vermelho) por estado. Nesse gráfico, a área em azul claro representa o volume de água que foi tratado e não foi consumido (perdas). Para vários estados, podemos observar que esse volume é bem significativo. É relevante salientar que os estados AL, MA, MS, PA, RN e TO possuem maiores volumes para o consumo de água do que para o tratamento, e isto não é nenhum erro. Isso ocorre porque alguns estados importam água de outros estados e operadoras. Na cor violeta podemos observar o volume de água consumida que não retornou como esgoto. Normalmente, para o cálculo de dimensionamento de estações de tratamento de esgoto, considera-se um retorno de aproximadamente 80% da água consumida, na forma de esgoto. Porém nesses dados, podemos observar que alguns estados possuem uma proporção bem menor, o que reflete que a maior parte dos esgotos nessas localidades ainda não são coletados. Os esgotos coletados que não foram tratados estão representados com cor de vinho, enquanto que em vermelho, temos a proporção de esgoto tratado. Podemos observar que o esgotamento é um problema muito grande na maior parte dos estados, correspondendo à um volume de esgoto coletado e tratado muito pequeno comparado com o volume consumido.

ggplot(df) +
  geom_bar(aes(x=State, y=AG007 / Population * 1000),
           stat = 'identity', fill='lightblue', alpha=0.5) +
  geom_bar(aes(x=State, y=AG010 / Population * 1000),
           stat = 'identity', fill='blue', alpha=0.5) +
  geom_bar(aes(x=State, y=ES005 / Population * 1000),
           stat = 'identity', fill='brown', alpha=0.5) +
  geom_bar(aes(x=State, y=ES006 / Population * 1000),
           stat = 'identity', fill='red', alpha=0.5) +
  theme_bw() +
  ylab('Volume per capta (L)') +
  xlab('Estado') +
  ggtitle('Volume de água tratada e consumida, esgoto coletado e tratado') +
  theme(
    axis.text.x = element_text(angle = 90),
    plot.title = element_text(hjust = 0.5)
  )

Finalmente, vamos criar duas novas colunas na tabela de dados df para poder criar o plot que relaciona a proporção da população com abastecimento de água e de esgotamento com o tamanho da população e estados.

# Criando a variável pop_water_prop que representa a proporção da população com abastecimento
df$pop_water_prop <- round(df$AG001/df$Population*100,1)

# Criando a variável pop_sewage_prop que representa a proporção da população com esgotamento
df$pop_sewage_prop <- round(df$ES001/df$Population*100,1)

Vamos gerar um objeto ggplot com a proporção da população atendida com abastecimento no eixo x, a população atendida com esgotamento no eixo y, o tamanho da população representado pelo tamanho dos pontos e com cores diferentes para cada região.

gg <- ggplot(df) +
  geom_point(aes(x=pop_water_prop,
                 y=pop_sewage_prop,
                 color=Region,
                 size=Population,
                 group=State)) +
  theme_bw() +
  xlab("% da população atendida com abastecimento") +
  ylab("% da população atendida com esgotamento") +
  ggtitle("% da população atentida com água e esgoto") +
  ylim(0,100) +
  xlim(0,100) +
  guides(color= guide_legend(), size=guide_legend()) +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Utilizando o objeto ggplot, agora podemos criar o gráfico interativo. Nesse último gráfico, podemos ver as regiões sudeste, sul e centro-oeste apresentam os maiores indices de abastecimento de água (grande maioria > 80%), porém somente 2 estados (SP e DF) representados pelas regiões sudeste e centro-oeste apresentam indices de esgotamento acima de 75%. A região nordeste ainda apresenta estados com baixo indice de abastecimento e a grande maioria possui um indice muito baixo para o esgotamento. Finalmente, o Norte apresenta os piores indices, tanto para o abastecimento quanto para o esgotamento. P.S.: Sorry for the messy legend. Consider the legend of the static version

ggplotly(gg) %>%
  highlight("plotly_hover")
FIM